import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
import java.io.FileWriter;
import java.io.PrintWriter;

public class Main {

	public static void main(String[] args) {

		Scanner ler = new Scanner(System.in);

		// Trecho responsavel por ler o arquivo de entrada com os dados
		// necessarios para montar o automato finito
		System.out
				.printf("Informe o nome do arquivo de texto que contem a especificacao do automato:\r\n");
		String nomeAutomato = ler.nextLine();

		String[] dados = { "", "", "" };

		try {

			FileReader arqAutomato = new FileReader(nomeAutomato);
			BufferedReader lerArqAutomato = new BufferedReader(arqAutomato);

			// Lemos a primeira linha para criarmos a lista de estados
			dados[0] = lerArqAutomato.readLine();

			// Lemos a segunda linha para criarmos o alfabeto
			dados[1] = lerArqAutomato.readLine();

			// Lemos as linhas subsequentes para criacao das transicoes
			String linha = lerArqAutomato.readLine();

			while (!linha.equals("#")) {
				dados[2] += linha + ",";
				linha = lerArqAutomato.readLine();
			}

			arqAutomato.close();

		} catch (IOException e) {

			System.err.printf("Erro na abertura do arquivo: %s.\r\n",
					e.getMessage());

		}

		// Agora podemos inicializar o automato
		AutomatoFinito automato = new AutomatoFinito(dados);

		// Trecho responsavel por ler o arquivo de entrada com as cadeias a
		// serem analisadas
		System.out
				.printf("\r\nInforme o nome do arquivo de texto que contem as cadeias a serem analisadas:\r\n");
		String nomeCadeias = ler.nextLine();

		String[] cadeias;

		String cadeia = "";

		try {

			FileReader arqCadeias = new FileReader(nomeCadeias);
			BufferedReader lerArqCadeias = new BufferedReader(arqCadeias);

			// Lemos as linhas do arquivo
			String linha = lerArqCadeias.readLine();

			cadeia += linha;

			linha = lerArqCadeias.readLine();

			while (!linha.equals("#")) {
				cadeia += "," + linha;
				linha = lerArqCadeias.readLine();
			}

			arqCadeias.close();

		} catch (IOException e) {

			System.err.printf("Erro na abertura do arquivo: %s.\r\n",
					e.getMessage());

		}

		cadeias = cadeia.split(",");

		// Neste trecho perguntamos o nome do arquivo de saida
		System.out
				.printf("\r\nInforme o nome do arquivo de texto de saida:\r\n");
		String nomeGravacao = ler.nextLine();

		try {

			FileWriter arqGravacao = new FileWriter(nomeGravacao);
			PrintWriter gravarArq = new PrintWriter(arqGravacao);

			automato.rodar(cadeias, gravarArq);

			arqGravacao.close();

			System.out
					.printf("\r\nArquivo de saida criado com sucesso!\r\n  O nome do arquivo e: "
							+ nomeGravacao);

		} catch (IOException e) {

			System.err.printf("Erro na abertura do arquivo: %s.\r\n",
					e.getMessage());

		}

	}

}